1. Field of the Invention
The present application generally relates to storing data on a storage medium, and more particularly to using error correction codes to correct errors in data stored in a storage medium.
2. Related Art
Data is stored in a storage device by writing the data to a storage medium in the storage device. The stored data can be later retrieved from the storage device by reading the data from the storage medium. However, for a number of reasons, an error may exist in the data retrieved from the storage device, meaning that the stored data cannot be retrieved or is different from the data originally stored on the storage medium. For example, a portion of the stored data on the storage medium may degenerate over time such that the portion of the stored data cannot be properly read at a later time.
In a conventional technique to correct such errors, an error correction code (ECC) is generated for the data and stored with the data in the storage medium. When the stored data is later retrieved and an error is detected, the ECC can be used to correct the retrieved data.
In one approach to using ECCs, data is arranged in an array and ECCs are generated for the data in two dimensions of the array (e.g., along the rows and the columns of the array). These are typically referred to as two-dimensional ECCs. One disadvantage of this approach is that as the size of the array increases so does the amount of time needed to generate the ECCs and to correct the retrieved data.
In another approach to using ECCs, ECCs are generated for data blocks and dispersed within the data blocks when stored in the storage medium. Because the locations of the ECCs dispersed within the data blocks need to be stored, one disadvantage of this approach is that it increases the amount of overhead dedicated to the ECCs, which can reduce the overall storage capacity of the storage device.
Additionally, in conventional techniques for correcting errors using ECCs, the size of the data blocks that can be used to store data on a storage medium can be constrained by the size of the errors that are expected. More particularly, data blocks are typically sized to correspond to the average size of the errors that are expected. Thus, small sized data blocks are used if small sized errors are expected, and large sized data blocks are used if large sized errors are expected.
However, for a number of reasons, it may be desirable to have a data block size, which is not proportionate to the average size of the errors that are expected. For example, if large amounts of data is typically stored and retrieved from a storage medium, then large data blocks are desirable, in part, to reduce access time and overhead. However, if the average size of the errors is small relative to the size of the data blocks, then the error correction is relatively inefficient because the entire data block needs to be corrected even for a small error.